package fr.afcepf.atod12.projet1.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import fr.afcepf.atod12.projet1.dao.interfaces.IDaoEvenement;
import fr.afcepf.atod12.projet1.entities.Evenement;
import fr.afcepf.atod12.projet1.entities.Medecin;
import fr.afcepf.atod12.projet1.entities.Patient;
import fr.afcepf.atod12.projet1.utils.PlageHoraire;


@Service("serviceEvenement")
@Transactional
public class ServiceEvenement implements IServiceEvenement {

	@Autowired
	@Qualifier("daoEvenement")
	private IDaoEvenement daoEvenement;

	@Override
	public int creationEvenement(Evenement evt) {
		return daoEvenement.creationEvenement(evt);
	}

	@Override
	public int ModifierEvenement(Evenement evt) {
		return daoEvenement.ModifierEvenement(evt);
	}

	@Override
	public void SupprimerEvenement(int idEvenement) {
		daoEvenement.SupprimerEvenement(idEvenement);
	}

	@Override
	public Evenement getEvenementById(int idEvenement) {
		return daoEvenement.getEvenementById(idEvenement);
	}

	@Override
	public Patient getPatientByIdEvt(Integer idevenement) {
		return daoEvenement.getPatientByIdEvt(idevenement);
	}

	@Override
	public List<Evenement> getEvenementByDate(Date date) {
		return daoEvenement.getEvenementByDate(date);
	}

	@SuppressWarnings({ "unchecked" })
	@Override
	public List<Evenement> getEvenementByDateMedecin(Date date, int idMedecin) {

		Medecin medecinWithEvenements = daoEvenement.getMedecinByDateMedecinWithEvenements(idMedecin, date);
		List<Evenement> evenements = new ArrayList<Evenement>();
		evenements = (List<Evenement>) medecinWithEvenements.getEvenements();

		return evenements;
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Override
	public List<Evenement> getEvenementByDateMedecinPatient(int idPatient, int idMedecin, Date date) {

		List<Evenement> listeEvtByDateMedecinPatient = new ArrayList<Evenement>();

		Medecin medecinWithEvenements = daoEvenement.getMedecinByDateMedecinWithEvenements(idMedecin, date);
		Set<Evenement> evenements = new HashSet();

		evenements = medecinWithEvenements.getEvenements();
		for(Evenement ev : evenements){
			int idEv = ev.getIdEvenement();

			if(daoEvenement.getPatientByIdEvt(idEv).getIdPatient().equals(idPatient)){
				listeEvtByDateMedecinPatient.add(ev);
			}
		}
		return listeEvtByDateMedecinPatient;
	}
	
	
	@SuppressWarnings({ "unchecked" })
	public List<Evenement> getEvenementsAValiderByMedecin(int idMedecin){


		Medecin medecinWithEvenements = daoEvenement.getMedecinByMedecinWithEvenementsAValider(idMedecin);

		List<Evenement> evenements = new ArrayList<Evenement>();
		evenements = (List<Evenement>) medecinWithEvenements.getEvenements();

		return evenements;
	}


	@Override
	public List<Evenement> getAllEvenementAValider() {
		return daoEvenement.getAllEvenementAValider();
	}

	public List<PlageHoraire> getPlageLibreOfEvenementsByDate(Date date){
		
		List<Evenement> listeEvenement = daoEvenement.getEvenementByDate(date);
		
		return getPlageLibreOfEvenements(listeEvenement);
	}

	public List<PlageHoraire> getPlageLibreOfEvenementsByDateMedecin(Date date, int idMedecin){
		
		List<Evenement> listeEvenement  =  (List<Evenement>) getEvenementByDateMedecin(date, idMedecin);
		
		return getPlageLibreOfEvenements(listeEvenement);
		
	}

	public List<PlageHoraire> getPlageLibreOfEvenements(List<Evenement> listeEvenement){

		int Deb=8;
		int Fin =18;
		int count =0;

		List<PlageHoraire> ListeHorairesEvts = new ArrayList<PlageHoraire>();
		List<PlageHoraire> listeHorairesFree = new ArrayList<PlageHoraire>();

		for(Evenement ev : listeEvenement){
			ListeHorairesEvts.add(new PlageHoraire(Integer.parseInt(ev.getHeureDebut()), Integer.parseInt(ev.getHeureFin())));
		}
		for (PlageHoraire horaires : ListeHorairesEvts) {

			if (Deb == horaires.getDebut()){
				Deb = horaires.getFin();
			}
			if (Deb < horaires.getDebut()){
				listeHorairesFree.add(new PlageHoraire(Deb, horaires.getDebut()));
				Deb = horaires.getFin();
			}
			count ++;
			if (count == ListeHorairesEvts.size())	{
				if(Fin > horaires.getFin())	{
					listeHorairesFree.add(new PlageHoraire(horaires.getFin(), Fin));
				}
			}
		}
		return listeHorairesFree;
	}

	
	
	public final void setDaoEvenement(IDaoEvenement daoEvenement) {
		this.daoEvenement = daoEvenement;
	}


	

}
